Tooltip colors
authorRaymond Penners <pennersr@src.gnome.org>
Sat, 23 Aug 2003 09:21:06 +0000 (09:21 +0000)
committerRaymond Penners <pennersr@src.gnome.org>
Sat, 23 Aug 2003 09:21:06 +0000 (09:21 +0000)
modules/engines/ms-windows/ChangeLog.old
modules/engines/ms-windows/Theme/gtk-2.0/gtkrc
modules/engines/ms-windows/wimp_style.c
modules/engines/ms-windows/xp_theme.c

index efa011bf26c1e251f2a1a7e4cccf0ec5d3f9fd29..949939d21c1475068e7b0a57785435fd4890d453 100755 (executable)
@@ -1,3 +1,8 @@
+2003-08-23  Raymond Penners <raymond@dotsphinx.com>\r
+\r
+       * src/*.c: Merged Dom Lachowicz's patches, now tooltips nicely\r
+       adhere to the system colors as well.\r
+\r
 2003-08-20  Raymond Penners <raymond@dotsphinx.com>\r
 \r
        * src/Theme/gtk-2.0/gtkrc: Disabled the colored, alternating\r
index 8a7c8540df975d4e428cbec17663829f006eea7b..728ee3a58480ef3e249644d1f06e59c51a21e4a4 100755 (executable)
@@ -1,15 +1,10 @@
 style "wimp-default"
 {
   GtkWidget::interior_focus = 1
-  GtkButton::default_border = { 1, 1, 1, 1 }
-  GtkButton::default_outside_border = { 0, 0, 0, 0 }
   GtkOptionMenu::indicator_size = { 9, 5 }
   GtkOptionMenu::indicator_spacing = { 7, 5, 2, 2 }
   GtkSpinButton::shadow-type = in
 
-  GtkButton::child_displacement_x = 1
-  GtkButton::child_displacement_y = 1
-
   GtkTreeView::allow-rules = 0
 
   engine "wimp" 
@@ -27,5 +22,4 @@ style "wimp-scrollbar"
   GtkRange::stepper_spacing = 0
 }
 
-class "GtkScrollbar" style "wimp-scrollbar"
-
+class "GtkScrollbar" style "wimp-scrollbar"
\ No newline at end of file
index a36c070a241363f89886537b44eb0306b9927af1..8ad221459b301a1d9dd51f387d1620b748a42c21 100755 (executable)
@@ -39,7 +39,6 @@ static GtkBorder default_option_indicator_spacing = { 7, 5, 2, 2 };
 
 static GtkStyleClass *parent_class;
 
-
 typedef enum {
   CHECK_AA,
   CHECK_BASE,
@@ -117,7 +116,6 @@ static struct {
   { radio_text_bits, NULL }
 };
 
-
 static gboolean
 get_system_font(LOGFONT *lf)
 {
@@ -160,15 +158,14 @@ get_system_font(LOGFONT *lf)
   return ok;
 }
 
-
 static void
 setup_system_font(GtkStyle *style)
 {
   LOGFONT lf;
-  
+
   if (get_system_font(&lf))
     {
-      char buf[64]; // It's okay, lfFaceName is smaller than 32 chars
+      char buf[64]; /* It's okay, lfFaceName is smaller than 32 chars */
       int pt_size;
 
       pt_size = -MulDiv(lf.lfHeight, 72,
@@ -178,8 +175,6 @@ setup_system_font(GtkStyle *style)
       style->font_desc = pango_font_description_from_string(buf);
     }
 }
-  
-
 
 static void
 sys_color_to_gtk_color(int id, GdkColor *pcolor)
@@ -192,7 +187,7 @@ sys_color_to_gtk_color(int id, GdkColor *pcolor)
 }
 
 static void
-setup_system_colors(GtkStyle *style)
+setup_system_styles(GtkStyle *style)
 {
   char buf[1024];
   GdkColor menu_color;
@@ -201,6 +196,11 @@ setup_system_colors(GtkStyle *style)
   GdkColor bg_prelight;
   GdkColor base_prelight;
   GdkColor text_prelight;
+  GdkColor tooltip_back;
+  GdkColor tooltip_fore;
+  GdkColor btn_fore;
+  GdkColor progress_back;
+
   int i;
 
   /* Default forgeground */
@@ -230,7 +230,7 @@ setup_system_colors(GtkStyle *style)
   sys_color_to_gtk_color(COLOR_WINDOWTEXT, &style->text[GTK_STATE_PRELIGHT]);
   sys_color_to_gtk_color(COLOR_HIGHLIGHTTEXT, &style->text[GTK_STATE_SELECTED]);
   sys_color_to_gtk_color(COLOR_GRAYTEXT, &style->text[GTK_STATE_INSENSITIVE]);
-  
+
   /* Prelight */
   sys_color_to_gtk_color(COLOR_HIGHLIGHTTEXT, &fg_prelight);
   sys_color_to_gtk_color(COLOR_HIGHLIGHT, &bg_prelight);
@@ -240,12 +240,27 @@ setup_system_colors(GtkStyle *style)
   sys_color_to_gtk_color(COLOR_MENUTEXT, &menu_text_color);
   sys_color_to_gtk_color(COLOR_MENU, &menu_color);
 
+  /* tooltips */
+  sys_color_to_gtk_color(COLOR_INFOTEXT, &tooltip_fore);
+  sys_color_to_gtk_color(COLOR_INFOBK, &tooltip_back);
+
+  /* text on push buttons. TODO: button shadows, backgrounds, and highlights */
+  sys_color_to_gtk_color(COLOR_BTNTEXT, &btn_fore);
+
+  /* progress bar background color */
+  sys_color_to_gtk_color(COLOR_HIGHLIGHT, &progress_back);
+
+  /* TODO: scrollbars
+  http://lxr.mozilla.org/mozilla/source/gfx/src/windows/nsNativeThemeWin.cpp#1317
+  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getsystemmetrics.asp
+  http://developer.gnome.org/doc/API/2.0/gtk/GtkRange.html
+  */
 
   for (i = 0; i < 5; i++)
     {
       sys_color_to_gtk_color(COLOR_3DSHADOW, &style->dark[i]);
       sys_color_to_gtk_color(COLOR_3DHILIGHT, &style->light[i]);
-      
+
       style->mid[i].red = (style->light[i].red + style->dark[i].red) / 2;
       style->mid[i].green = (style->light[i].green + style->dark[i].green) / 2;
       style->mid[i].blue = (style->light[i].blue + style->dark[i].blue) / 2;
@@ -254,8 +269,8 @@ setup_system_colors(GtkStyle *style)
       style->text_aa[i].green = (style->text[i].green + style->base[i].green) / 2;
       style->text_aa[i].blue = (style->text[i].blue + style->base[i].blue) / 2;
     }
-  
-  // Enable coloring for menus.
+
+  /* Enable coloring for menus. */
   sprintf(buf, "style \"wimp-menu\"\n"
           "{fg[PRELIGHT] = { %d, %d, %d }\n"
           "bg[PRELIGHT] = { %d, %d, %d }\n"
@@ -283,13 +298,45 @@ setup_system_colors(GtkStyle *style)
           menu_color.green,
           menu_color.blue);
   gtk_rc_parse_string(buf);
-}
-
 
+  /* enable coloring for tooltips */
+  sprintf(buf, "style \"wimp-tooltips\"\n"
+         "{fg[NORMAL] = { %d, %d, %d }\n"
+         "bg[NORMAL] = { %d, %d, %d }\n"
+         "}widget \"*gtk-tooltips*\" style \"wimp-tooltips\"\n",
+          tooltip_fore.red,
+          tooltip_fore.green,
+          tooltip_fore.blue,
+          tooltip_back.red,
+          tooltip_back.green,
+          tooltip_back.blue);
+  gtk_rc_parse_string(buf);
 
+  /* enable coloring for text on buttons
+     TODO: use GetThemeMetric for the border and outside border */
+  sprintf(buf, "style \"wimp-button\"\n"
+         "fg[NORMAL] = { %d, %d, %d }\n"
+         "default_border = { 1, 1, 1, 1 }\n"
+         "default_outside_border = { 0, 0, 0, 0 }\n"
+         "child_displacement_x = 1\n"
+         "child_displacement_y = 1\n"
+         "}widget_class \"*GtkButton*\" style \"wimp-button\"\n",
+         btn_fore.red,
+      btn_fore.green,
+      btn_fore.blue);
+  gtk_rc_parse_string(buf);
 
+  /* enable coloring for progress bars */
+  sprintf(buf, "style \"wimp-progress\"\n"
+         "{bg[PRELIGHT] = { %d, %d, %d }\n"
+         "}widget_class \"*GtkProgress*\" style \"wimp-progress\"\n",
+         progress_back.red,
+      progress_back.green,
+      progress_back.blue);
+  gtk_rc_parse_string(buf);
+}
 
-static gboolean 
+static gboolean
 sanitize_size (GdkWindow *window,
               gint      *width,
               gint      *height)
@@ -340,7 +387,7 @@ draw_part (GdkDrawable  *drawable,
 {
   if (area)
     gdk_gc_set_clip_rectangle (gc, area);
-  
+
   if (!parts[part].bmap)
       parts[part].bmap = gdk_bitmap_create_from_data (drawable,
                                                      parts[part].bits,
@@ -373,7 +420,7 @@ draw_check(GtkStyle      *style,
 {
   x -= (1 + PART_SIZE - width) / 2;
   y -= (1 + PART_SIZE - height) / 2;
-      
+
   if (detail && strcmp (detail, "check") == 0) /* Menu item */
     {
       if (shadow == GTK_SHADOW_IN)
@@ -397,7 +444,7 @@ draw_check(GtkStyle      *style,
           draw_part (window, style->mid_gc[state], area, x, y, CHECK_MID);
           draw_part (window, style->light_gc[state], area, x, y, CHECK_LIGHT);
           draw_part (window, style->base_gc[state], area, x, y, CHECK_BASE);
-      
+
           if (shadow == GTK_SHADOW_IN)
             {
               draw_part (window, style->text_gc[state], area, x, y, CHECK_TEXT);
@@ -437,7 +484,7 @@ draw_expander(GtkStyle      *style,
       xp_expander = XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED;
       break;
     }
-  
+
   if (xp_theme_draw(window, xp_expander, style,
                     x, y - expander_size / 2,
                     expander_size, expander_size, state))
@@ -471,7 +518,7 @@ draw_expander(GtkStyle      *style,
 
   if (success)
     gdk_gc_set_foreground (style->fg_gc[state], &values.foreground);
-  
+
   gdk_draw_line
     (window, style->fg_gc[state], x + 2, y + expander_semi_size,
      x + expander_size - 2, y + expander_semi_size);
@@ -505,7 +552,7 @@ draw_option(GtkStyle      *style,
 {
   x -= (1 + PART_SIZE - width) / 2;
   y -= (1 + PART_SIZE - height) / 2;
-      
+
   if (detail && strcmp (detail, "option") == 0)        /* Menu item */
     {
       if (shadow == GTK_SHADOW_IN)
@@ -525,7 +572,7 @@ draw_option(GtkStyle      *style,
          draw_part (window, style->mid_gc[state], area, x, y, RADIO_MID);
          draw_part (window, style->light_gc[state], area, x, y, RADIO_LIGHT);
          draw_part (window, style->base_gc[state], area, x, y, RADIO_BASE);
-      
+
          if (shadow == GTK_SHADOW_IN)
            draw_part (window, style->text_gc[state], area, x, y, RADIO_TEXT);
        }
@@ -549,9 +596,9 @@ draw_varrow (GdkWindow     *window,
 
   if (area)
     gdk_gc_set_clip_rectangle (gc, area);
-  
+
   width = width + width % 2 - 1;       /* Force odd */
-  
+
   steps = 1 + width / 2;
 
   extra = height - steps;
@@ -581,7 +628,7 @@ draw_varrow (GdkWindow     *window,
                     x + (i - extra),              y_start + i * y_increment,
                     x + width - (i - extra) - 1,  y_start + i * y_increment);
     }
-  
+
 
   if (area)
     gdk_gc_set_clip_rectangle (gc, NULL);
@@ -604,9 +651,9 @@ draw_harrow (GdkWindow     *window,
 
   if (area)
     gdk_gc_set_clip_rectangle (gc, area);
-  
+
   height = height + height % 2 - 1;    /* Force odd */
-  
+
   steps = 1 + height / 2;
 
   extra = width - steps;
@@ -636,7 +683,7 @@ draw_harrow (GdkWindow     *window,
                     x_start + i * x_increment, y + (i - extra),
                     x_start + i * x_increment, y + height - (i - extra) - 1);
     }
-  
+
 
   if (area)
     gdk_gc_set_clip_rectangle (gc, NULL);
@@ -660,7 +707,7 @@ reverse_engineer_stepper_box (GtkWidget    *range,
   gint slider_width = 14, stepper_size = 14;
   gint box_width;
   gint box_height;
-  
+
   if (range)
     {
       gtk_widget_style_get (range,
@@ -668,7 +715,7 @@ reverse_engineer_stepper_box (GtkWidget    *range,
                            "stepper_size", &stepper_size,
                            NULL);
     }
-       
+
   if (arrow_type == GTK_ARROW_UP || arrow_type == GTK_ARROW_DOWN)
     {
       box_width = slider_width;
@@ -703,7 +750,7 @@ draw_arrow (GtkStyle      *style,
            gint           height)
 {
   sanitize_size (window, &width, &height);
-  
+
   if (detail && strcmp (detail, "spinbutton") == 0)
     {
       if (xp_theme_is_drawable(XP_THEME_ELEMENT_SPIN_BUTTON_UP))
@@ -774,7 +821,7 @@ draw_arrow (GtkStyle      *style,
        {
          x += (width - 7) / 2;
          y += (height - 5) / 2;
-         
+
          draw_varrow (window, style->fg_gc[state], shadow, area, arrow_type,
                       x, y, 7, 5);
        }
@@ -782,7 +829,7 @@ draw_arrow (GtkStyle      *style,
        {
          x += (width - 5) / 2;
          y += (height - 7) / 2;
-         
+
          draw_harrow (window, style->fg_gc[state], shadow, area, arrow_type,
                       x, y, 5, 7);
        }
@@ -796,9 +843,9 @@ option_menu_get_props (GtkWidget      *widget,
 {
   GtkRequisition *tmp_size = NULL;
   GtkBorder *tmp_spacing = NULL;
-  
+
   if (widget)
-    gtk_widget_style_get (widget, 
+    gtk_widget_style_get (widget,
                          "indicator_size", &tmp_size,
                          "indicator_spacing", &tmp_spacing,
                          NULL);
@@ -820,7 +867,7 @@ option_menu_get_props (GtkWidget      *widget,
     *indicator_spacing = default_option_indicator_spacing;
 }
 
-static void 
+static void
 draw_box (GtkStyle      *style,
          GdkWindow     *window,
          GtkStateType   state_type,
@@ -862,7 +909,7 @@ draw_box (GtkStyle      *style,
   else if (detail && (!strcmp (detail, "spinbutton_up")
                       || !strcmp (detail, "spinbutton_down")))
     {
-      if (xp_theme_draw(window, 
+      if (xp_theme_draw(window,
                         (! strcmp (detail, "spinbutton_up"))
                         ? XP_THEME_ELEMENT_SPIN_BUTTON_UP
                         : XP_THEME_ELEMENT_SPIN_BUTTON_DOWN,
@@ -877,7 +924,7 @@ draw_box (GtkStyle      *style,
       if (GTK_IS_SCROLLBAR(widget))
         {
           GtkScrollbar * scrollbar = GTK_SCROLLBAR(widget);
-          if (xp_theme_draw(window, 
+          if (xp_theme_draw(window,
                             (! GTK_IS_VSCROLLBAR(widget))
                             ? XP_THEME_ELEMENT_SCROLLBAR_V
                             : XP_THEME_ELEMENT_SCROLLBAR_H,
@@ -901,9 +948,9 @@ draw_box (GtkStyle      *style,
         }
     }
 
-  if (detail && strcmp (detail, "menuitem") == 0) 
+  if (detail && strcmp (detail, "menuitem") == 0)
     shadow_type = GTK_SHADOW_NONE;
-  
+
   if (detail && !strcmp (detail, "trough"))
     {
       if (widget && GTK_IS_PROGRESS_BAR (widget))
@@ -917,13 +964,13 @@ draw_box (GtkStyle      *style,
             }
           else
             {
-              // Blank in classic Windows
+              /* Blank in classic Windows */
             }
         }
       else
         {
           gboolean is_vertical = GTK_IS_VSCROLLBAR(widget);
-          
+
           if (GTK_IS_RANGE(widget)
               && xp_theme_draw(window,
                                is_vertical
@@ -941,7 +988,7 @@ draw_box (GtkStyle      *style,
               GdkPixmap *pixmap;
 
               sanitize_size (window, &width, &height);
-         
+
               pixmap = gdk_pixmap_new (window, 2, 2, -1);
 
               gdk_draw_point (pixmap, style->bg_gc[GTK_STATE_NORMAL], 0, 0);
@@ -958,12 +1005,12 @@ draw_box (GtkStyle      *style,
 
               if (area)
                 gdk_gc_set_clip_rectangle (gc, area);
-      
+
               gdk_draw_rectangle (window, gc, TRUE, x, y, width, height);
 
               gdk_gc_unref (gc);
               gdk_pixmap_unref (pixmap);
-      
+
               return;
             }
         }
@@ -989,10 +1036,10 @@ draw_box (GtkStyle      *style,
       option_menu_get_props (widget, &indicator_size, &indicator_spacing);
 
       sanitize_size (window, &width, &height);
-  
+
       if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
        vline_x = x + indicator_size.width + indicator_spacing.left + indicator_spacing.right;
-      else 
+      else
        vline_x = x + width - (indicator_size.width + indicator_spacing.left + indicator_spacing.right) - style->xthickness;
 
       parent_class->draw_vline (style, window, state_type, area, widget,
@@ -1018,9 +1065,9 @@ draw_tab (GtkStyle      *style,
 {
   GtkRequisition indicator_size;
   GtkBorder indicator_spacing;
-  
+
   gint arrow_height;
-  
+
   g_return_if_fail (style != NULL);
   g_return_if_fail (window != NULL);
 
@@ -1041,14 +1088,13 @@ draw_tab (GtkStyle      *style,
 
   x += (width - indicator_size.width) / 2;
   arrow_height = (indicator_size.width + 1) / 2;
-  
+
   y += (height - arrow_height) / 2;
 
   draw_varrow (window, style->black_gc, shadow, area, GTK_ARROW_DOWN,
               x, y, indicator_size.width, arrow_height);
 }
 
-  
 static void
 draw_extension(GtkStyle *style,
                GdkWindow *window,
@@ -1081,7 +1127,7 @@ draw_extension(GtkStyle *style,
           return;
         }
     }
-  parent_class->draw_extension 
+  parent_class->draw_extension
     (style, window, state_type, shadow_type, area, widget, detail,
         x, y, width, height, gap_side);
 }
@@ -1125,15 +1171,14 @@ draw_flat_box (GtkStyle *style, GdkWindow *window,
         }
     }
 
-  //      gtk_style_apply_default_background (style, window,
-  //                             widget && !GTK_WIDGET_NO_WINDOW (widget),
-  //                             state_type, area, x, y, width, height);
-  
+  /*      gtk_style_apply_default_background (style, window,
+                                 widget && !GTK_WIDGET_NO_WINDOW (widget),
+                                 state_type, area, x, y, width, height);
+  */
   parent_class->draw_flat_box(style, window, state_type, shadow_type,
                               area, widget, detail, x, y, width, height);
 }
 
-
 static void
 draw_shadow (GtkStyle      *style,
              GdkWindow     *window,
@@ -1165,12 +1210,11 @@ draw_shadow (GtkStyle      *style,
                              detail, x, y, width, height);
 }
 
-
 static void
 wimp_style_init_from_rc (GtkStyle * style, GtkRcStyle * rc_style)
 {
   setup_system_font (style);
-  setup_system_colors (style);
+  setup_system_styles (style);
   parent_class->init_from_rc(style, rc_style);
 }
 
@@ -1217,7 +1261,7 @@ wimp_style_register_type (GTypeModule *module)
     0,              /* n_preallocs */
     (GInstanceInitFunc) wimp_style_init,
   };
-  
+
   wimp_type_style = g_type_module_register_type (module,
                                                   GTK_TYPE_STYLE,
                                                   "WimpStyle",
index 645eb8781f49b2ba6f8572d1b96d0381b2d99bbb..6f7ad27b79b5cdbad4ae6f76663d6bbfe256c567 100755 (executable)
-/* Wimp "Windows Impersonator" Engine\r
- *\r
- * Copyright (C) 2003 Raymond Penners <raymond@dotsphinx.com>\r
- *\r
- * This library is free software; you can redistribute it and/or\r
- * modify it under the terms of the GNU Library General Public\r
- * License as published by the Free Software Foundation; either\r
- * version 2 of the License, or (at your option) any later version.\r
- *\r
- * This library is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
- * Library General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU Library General Public\r
- * License along with this library; if not, write to the\r
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,\r
- * Boston, MA 02111-1307, USA.\r
- */\r
-\r
-#include "xp_theme.h"\r
-\r
-#include <windows.h>\r
-#include <uxtheme.h>\r
-#include <tmschema.h>\r
-#include <math.h>\r
-#include <string.h>\r
-#include <gdk/gdkwin32.h>\r
-\r
-#include <stdio.h>\r
-\r
-\r
-static LPCWSTR class_descriptors[] =\r
-{\r
-  L"Scrollbar",\r
-  L"Button",\r
-  L"Header",\r
-  L"ComboBox",\r
-  L"Tab",\r
-  L"Edit",\r
-  L"TreeView",\r
-  L"Spin",\r
-  L"Progress",\r
-};\r
-\r
-static const short element_part_map[]=\r
-{\r
-  BP_CHECKBOX,\r
-  BP_CHECKBOX,\r
-  BP_PUSHBUTTON,\r
-  HP_HEADERITEM,\r
-  CP_DROPDOWNBUTTON,\r
-  TABP_BODY,\r
-  TABP_TABITEM,\r
-  TABP_TABITEMLEFTEDGE,\r
-  TABP_PANE,\r
-  SBP_THUMBBTNHORZ,\r
-  SBP_THUMBBTNVERT,\r
-  SBP_ARROWBTN,\r
-  SBP_ARROWBTN,\r
-  SBP_ARROWBTN,\r
-  SBP_ARROWBTN,\r
-  SBP_GRIPPERHORZ,\r
-  SBP_GRIPPERVERT,\r
-  SBP_LOWERTRACKHORZ,\r
-  SBP_LOWERTRACKVERT,\r
-  EP_EDITTEXT,\r
-  BP_PUSHBUTTON,\r
-  SPNP_UP,\r
-  SPNP_DOWN,\r
-  BP_RADIOBUTTON,\r
-  TVP_GLYPH,\r
-  TVP_GLYPH,\r
-  PP_CHUNK,\r
-  PP_CHUNKVERT,\r
-  PP_BAR,\r
-  PP_BARVERT,\r
-};\r
-\r
-\r
-static HINSTANCE uxtheme_dll = NULL;\r
-static HTHEME open_themes[XP_THEME_CLASS__SIZEOF];\r
-\r
-typedef HRESULT (FAR PASCAL *GetThemeSysFontFunc)\r
-     (HTHEME hTheme, int iFontID, FAR LOGFONTW *plf);\r
-typedef HTHEME (FAR PASCAL *OpenThemeDataFunc)\r
-     (HWND hwnd, LPCWSTR pszClassList);\r
-typedef HRESULT (FAR PASCAL *CloseThemeDataFunc)(HTHEME theme);\r
-typedef HRESULT (FAR PASCAL *DrawThemeBackgroundFunc)\r
-     (HTHEME hTheme, HDC hdc, int iPartId, int iStateId,\r
-      const RECT *pRect, const RECT *pClipRect);\r
-typedef HRESULT (FAR PASCAL *EnableThemeDialogTextureFunc)(HWND hwnd, DWORD dwFlags);\r
-\r
-static GetThemeSysFontFunc get_theme_sys_font_func = NULL;\r
-static OpenThemeDataFunc open_theme_data_func = NULL;\r
-static CloseThemeDataFunc close_theme_data_func = NULL;\r
-static DrawThemeBackgroundFunc draw_theme_background_func = NULL;\r
-static EnableThemeDialogTextureFunc enable_theme_dialog_texture_func = NULL;\r
-\r
-void\r
-xp_theme_init()\r
-{\r
-  int i;\r
-  \r
-  if (uxtheme_dll)\r
-    return;\r
-  \r
-  uxtheme_dll = LoadLibrary("uxtheme.dll");\r
-  memset(open_themes, 0, sizeof(open_themes));\r
-  \r
-  open_theme_data_func = (OpenThemeDataFunc) GetProcAddress(uxtheme_dll, "OpenThemeData");\r
-  close_theme_data_func = (CloseThemeDataFunc) GetProcAddress(uxtheme_dll, "CloseThemeData");\r
-  draw_theme_background_func = (DrawThemeBackgroundFunc) GetProcAddress(uxtheme_dll, "DrawThemeBackground");\r
-  enable_theme_dialog_texture_func = (EnableThemeDialogTextureFunc) GetProcAddress(uxtheme_dll, "EnableThemeDialogTexture");\r
-  get_theme_sys_font_func = (GetThemeSysFontFunc) GetProcAddress(uxtheme_dll, "GetThemeSysFont");\r
-}\r
-\r
-void\r
-xp_theme_exit()\r
-{\r
-  int i;\r
-  \r
-  if(! uxtheme_dll)\r
-    return;\r
-\r
-  for (i=0; i<XP_THEME_CLASS__SIZEOF; i++)\r
-    {\r
-      if (open_themes[i])\r
-        {\r
-          close_theme_data_func(open_themes[i]);\r
-          open_themes[i] = NULL;\r
-       }\r
-    }\r
-\r
-  FreeLibrary(uxtheme_dll);\r
-  uxtheme_dll = NULL;\r
-\r
-  open_theme_data_func = NULL;\r
-  close_theme_data_func = NULL;\r
-  draw_theme_background_func = NULL;\r
-  enable_theme_dialog_texture_func = NULL;\r
-  get_theme_sys_font_func = NULL;\r
-}\r
-\r
-static HTHEME\r
-xp_theme_get_handle_by_class(XpThemeClass klazz)\r
-{\r
-  if (!open_themes[klazz] && open_theme_data_func)\r
-    {\r
-      open_themes[klazz] = open_theme_data_func(NULL, class_descriptors[klazz]);\r
-    }\r
-  return open_themes[klazz];\r
-}\r
-\r
-static HTHEME\r
-xp_theme_get_handle_by_element(XpThemeElement element)\r
-{\r
-  HTHEME ret = NULL;\r
-  XpThemeClass klazz = XP_THEME_CLASS__SIZEOF;\r
-\r
-  switch(element)\r
-    {\r
-    case XP_THEME_ELEMENT_PRESSED_CHECKBOX:\r
-    case XP_THEME_ELEMENT_CHECKBOX:\r
-    case XP_THEME_ELEMENT_BUTTON:\r
-    case XP_THEME_ELEMENT_DEFAULT_BUTTON:\r
-    case XP_THEME_ELEMENT_RADIO_BUTTON:\r
-      klazz = XP_THEME_CLASS_BUTTON;\r
-      break;\r
-\r
-    case XP_THEME_ELEMENT_LIST_HEADER:\r
-      klazz = XP_THEME_CLASS_HEADER;\r
-      break;\r
-      \r
-    case XP_THEME_ELEMENT_COMBOBUTTON:\r
-      klazz = XP_THEME_CLASS_COMBOBOX;\r
-      break;\r
-      \r
-    case XP_THEME_ELEMENT_BODY:\r
-    case XP_THEME_ELEMENT_TAB_ITEM:\r
-    case XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE:\r
-    case XP_THEME_ELEMENT_TAB_PANE:\r
-      klazz = XP_THEME_CLASS_TAB;\r
-      break;\r
-      \r
-    case XP_THEME_ELEMENT_SCROLLBAR_V:\r
-    case XP_THEME_ELEMENT_SCROLLBAR_H:\r
-    case XP_THEME_ELEMENT_ARROW_UP: \r
-    case XP_THEME_ELEMENT_ARROW_DOWN:\r
-    case XP_THEME_ELEMENT_ARROW_LEFT:\r
-    case XP_THEME_ELEMENT_ARROW_RIGHT: \r
-    case XP_THEME_ELEMENT_GRIP_V: \r
-    case XP_THEME_ELEMENT_GRIP_H: \r
-    case XP_THEME_ELEMENT_TROUGH_V:\r
-    case XP_THEME_ELEMENT_TROUGH_H:\r
-      klazz = XP_THEME_CLASS_SCROLLBAR;\r
-      break;\r
-      \r
-    case XP_THEME_ELEMENT_EDIT_TEXT:\r
-      klazz = XP_THEME_CLASS_EDIT;\r
-      break;\r
-\r
-    case XP_THEME_ELEMENT_SPIN_BUTTON_UP:\r
-    case XP_THEME_ELEMENT_SPIN_BUTTON_DOWN:\r
-      klazz = XP_THEME_CLASS_SPIN;\r
-      break;\r
-\r
-    case XP_THEME_ELEMENT_PROGRESS_BAR_H:\r
-    case XP_THEME_ELEMENT_PROGRESS_BAR_V:\r
-    case XP_THEME_ELEMENT_PROGRESS_TROUGH_H:\r
-    case XP_THEME_ELEMENT_PROGRESS_TROUGH_V:\r
-      klazz = XP_THEME_CLASS_PROGRESS;\r
-      break;\r
-\r
-    case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED:\r
-    case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED:\r
-      klazz = XP_THEME_CLASS_TREEVIEW;\r
-      break;\r
-    }\r
-\r
-  if (klazz != XP_THEME_CLASS__SIZEOF)\r
-    {\r
-      ret = xp_theme_get_handle_by_class (klazz);\r
-    }\r
-  return ret;\r
-}\r
-\r
-\r
-static int \r
-xp_theme_map_gtk_state(XpThemeElement element, GtkStateType state)\r
-{\r
-  int ret;\r
-\r
-  switch(element)\r
-    {\r
-    case XP_THEME_ELEMENT_TAB_PANE:\r
-      ret = 0;\r
-      break;\r
-      \r
-    case XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE:\r
-    case XP_THEME_ELEMENT_TAB_ITEM:\r
-      switch(state)\r
-        {\r
-        case GTK_STATE_PRELIGHT:\r
-          ret =  TIS_HOT;\r
-          break;\r
-        case GTK_STATE_INSENSITIVE:\r
-          ret =  TIS_DISABLED;\r
-          break;\r
-        case GTK_STATE_SELECTED:\r
-        case GTK_STATE_ACTIVE:\r
-          ret =  TIS_NORMAL;\r
-          break;\r
-        default:\r
-          ret =  TIS_SELECTED;\r
-        }\r
-      break;\r
-\r
-    case XP_THEME_ELEMENT_EDIT_TEXT:\r
-      switch(state)\r
-        {\r
-        case GTK_STATE_PRELIGHT:\r
-          ret =  ETS_FOCUSED;\r
-          break;\r
-        case GTK_STATE_INSENSITIVE:\r
-          ret =  ETS_READONLY;\r
-          break;\r
-        case GTK_STATE_SELECTED:\r
-        case GTK_STATE_ACTIVE:\r
-        default:\r
-          ret =  ETS_NORMAL;\r
-        }\r
-      break;\r
-\r
-    case XP_THEME_ELEMENT_SCROLLBAR_H:\r
-    case XP_THEME_ELEMENT_SCROLLBAR_V:\r
-    case XP_THEME_ELEMENT_TROUGH_H:\r
-    case XP_THEME_ELEMENT_TROUGH_V:\r
-      switch(state)\r
-        {\r
-        case GTK_STATE_SELECTED:\r
-        case GTK_STATE_ACTIVE:\r
-          ret =  SCRBS_PRESSED;\r
-          break;\r
-        case GTK_STATE_PRELIGHT:\r
-          ret =  SCRBS_HOT;\r
-          break;\r
-        case GTK_STATE_INSENSITIVE:\r
-          ret =  SCRBS_DISABLED;\r
-          break;\r
-        default:\r
-          ret =  SCRBS_NORMAL;\r
-        }\r
-      break;\r
-\r
-    case XP_THEME_ELEMENT_ARROW_DOWN:\r
-      switch(state)\r
-        {\r
-        case GTK_STATE_ACTIVE:\r
-          ret =  ABS_DOWNPRESSED;\r
-          break;\r
-        case GTK_STATE_PRELIGHT:\r
-          ret =  ABS_DOWNHOT;\r
-          break;\r
-        case GTK_STATE_INSENSITIVE:\r
-          ret =  ABS_DOWNDISABLED;\r
-          break;\r
-        default:\r
-          ret =  ABS_DOWNNORMAL;\r
-        }\r
-      break;\r
-\r
-    case XP_THEME_ELEMENT_ARROW_UP:\r
-      switch(state)\r
-        {\r
-        case GTK_STATE_ACTIVE:\r
-          ret =  ABS_UPPRESSED;\r
-          break;\r
-        case GTK_STATE_PRELIGHT:\r
-          ret =  ABS_UPHOT;\r
-          break;\r
-        case GTK_STATE_INSENSITIVE:\r
-          ret =  ABS_UPDISABLED;\r
-          break;\r
-        default:\r
-          ret =  ABS_UPNORMAL;\r
-        }\r
-      break;\r
-\r
-    case XP_THEME_ELEMENT_ARROW_LEFT:\r
-      switch(state)\r
-        {\r
-        case GTK_STATE_ACTIVE:\r
-          ret =  ABS_LEFTPRESSED;\r
-          break;\r
-        case GTK_STATE_PRELIGHT:\r
-          ret =  ABS_LEFTHOT;\r
-          break;\r
-        case GTK_STATE_INSENSITIVE:\r
-          ret =  ABS_LEFTDISABLED;\r
-          break;\r
-        default:\r
-          ret =  ABS_LEFTNORMAL;\r
-        }\r
-      break;\r
-\r
-    case XP_THEME_ELEMENT_ARROW_RIGHT:\r
-      switch(state)\r
-        {\r
-        case GTK_STATE_ACTIVE:\r
-          ret =  ABS_RIGHTPRESSED;\r
-          break;\r
-        case GTK_STATE_PRELIGHT:\r
-          ret =  ABS_RIGHTHOT;\r
-          break;\r
-        case GTK_STATE_INSENSITIVE:\r
-          ret =  ABS_RIGHTDISABLED;\r
-          break;\r
-        default:\r
-          ret =  ABS_RIGHTNORMAL;\r
-        }\r
-      break;\r
-\r
-    case XP_THEME_ELEMENT_CHECKBOX:\r
-    case XP_THEME_ELEMENT_RADIO_BUTTON:\r
-      switch(state)\r
-        {\r
-        case GTK_STATE_SELECTED:\r
-          ret =  CBS_CHECKEDPRESSED;\r
-          break;\r
-        case GTK_STATE_PRELIGHT:\r
-          ret =  CBS_UNCHECKEDHOT;\r
-          break;\r
-        case GTK_STATE_INSENSITIVE:\r
-          ret =  CBS_UNCHECKEDDISABLED;\r
-          break;\r
-        default:\r
-          ret =  CBS_UNCHECKEDNORMAL;\r
-        }\r
-      break;\r
-\r
-    case XP_THEME_ELEMENT_PRESSED_CHECKBOX:\r
-      switch(state)\r
-        {\r
-        case GTK_STATE_SELECTED:\r
-          ret =  CBS_CHECKEDPRESSED;\r
-          break;\r
-        case GTK_STATE_PRELIGHT:\r
-          ret =  CBS_CHECKEDHOT;\r
-          break;\r
-        case GTK_STATE_INSENSITIVE:\r
-          ret =  CBS_CHECKEDDISABLED;\r
-          break;\r
-        default:\r
-          ret =  CBS_CHECKEDNORMAL;\r
-        }\r
-      break;\r
-\r
-    XP_THEME_ELEMENT_DEFAULT_BUTTON:\r
-      switch(state)\r
-        {\r
-        case GTK_STATE_ACTIVE:\r
-          ret =  PBS_PRESSED;\r
-          break;\r
-        case GTK_STATE_PRELIGHT:\r
-          ret =  PBS_HOT;\r
-          break;\r
-        case GTK_STATE_INSENSITIVE:\r
-          ret =  PBS_DISABLED;\r
-          break;\r
-        default:\r
-          ret =  PBS_DEFAULTED;\r
-        }\r
-      break;\r
-\r
-    case XP_THEME_ELEMENT_SPIN_BUTTON_DOWN:\r
-      switch(state)\r
-        {\r
-        case GTK_STATE_ACTIVE:\r
-          ret =  DNS_PRESSED;\r
-          break;\r
-        case GTK_STATE_PRELIGHT:\r
-          ret =  DNS_HOT;\r
-          break;\r
-        case GTK_STATE_INSENSITIVE:\r
-          ret =  DNS_DISABLED;\r
-          break;\r
-        default:\r
-          ret =  DNS_NORMAL;\r
-        }\r
-      break;\r
-\r
-    case XP_THEME_ELEMENT_SPIN_BUTTON_UP:\r
-      switch(state)\r
-        {\r
-        case GTK_STATE_ACTIVE:\r
-          ret =  UPS_PRESSED;\r
-          break;\r
-        case GTK_STATE_PRELIGHT:\r
-          ret =  UPS_HOT;\r
-          break;\r
-        case GTK_STATE_INSENSITIVE:\r
-          ret =  UPS_DISABLED;\r
-          break;\r
-        default:\r
-          ret =  UPS_NORMAL;\r
-        }\r
-      break;\r
-\r
-    case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED:\r
-      ret = GLPS_OPENED;\r
-      break;\r
-\r
-    case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED:\r
-      ret = GLPS_CLOSED;\r
-      break;\r
-\r
-    case XP_THEME_ELEMENT_PROGRESS_BAR_H:\r
-    case XP_THEME_ELEMENT_PROGRESS_BAR_V:\r
-    case XP_THEME_ELEMENT_PROGRESS_TROUGH_H:\r
-    case XP_THEME_ELEMENT_PROGRESS_TROUGH_V:\r
-      ret = 0;\r
-      break;\r
-      \r
-    default:\r
-      switch(state)\r
-        {\r
-        case GTK_STATE_ACTIVE:\r
-          ret =  PBS_PRESSED;\r
-          break;\r
-        case GTK_STATE_PRELIGHT:\r
-          ret =  PBS_HOT;\r
-          break;\r
-        case GTK_STATE_INSENSITIVE:\r
-          ret =  PBS_DISABLED;\r
-          break;\r
-        default:\r
-          ret =  PBS_NORMAL;\r
-        }\r
-    }\r
-  return ret;\r
-}  \r
-\r
-gboolean\r
-xp_theme_draw(GdkWindow *win, XpThemeElement element, GtkStyle *style,\r
-              int x, int y, int width, int height, GtkStateType state_type)\r
-{\r
-  HTHEME theme;\r
-  RECT rect;\r
-  int xoff, yoff, state;\r
-  HDC dc;\r
-  GdkDrawable *drawable;\r
-  int part_state;\r
-  \r
-  if (!uxtheme_dll)\r
-    return FALSE;\r
-\r
-  theme = xp_theme_get_handle_by_element(element);\r
-  if (!theme)\r
-    return FALSE;\r
-\r
-  // FIXME: Recheck its function\r
-  enable_theme_dialog_texture_func(GDK_WINDOW_HWND(win), ETDT_ENABLETAB);\r
-\r
-  if (!GDK_IS_WINDOW(win))\r
-    {\r
-      xoff = 0;\r
-      yoff = 0;\r
-      drawable = win;\r
-    }\r
-  else\r
-    {\r
-      gdk_window_get_internal_paint_info(win, &drawable, &xoff, &yoff);\r
-    }\r
-  rect.left = x - xoff;\r
-  rect.top = y - yoff;\r
-  rect.right = rect.left + width;\r
-  rect.bottom = rect.top + height;\r
-\r
-  gdk_gc_set_clip_rectangle (style->dark_gc[state_type], NULL);\r
-  dc = gdk_win32_hdc_get(drawable, style->dark_gc[state_type], 0);\r
-  if (!dc)\r
-    return FALSE;\r
-\r
-  part_state = xp_theme_map_gtk_state(element, state_type);\r
-  draw_theme_background_func(theme, dc, element_part_map[element], part_state, &rect, 0);\r
-  gdk_win32_hdc_release(drawable, style->dark_gc[state_type], 0);\r
-\r
-  return TRUE;\r
-}\r
-\r
-gboolean\r
-xp_theme_is_drawable(XpThemeElement element)\r
-{\r
-  gboolean ret = FALSE;\r
-  \r
-  if (uxtheme_dll)\r
-    {\r
-      ret = xp_theme_get_handle_by_element(element) != NULL;\r
-    }\r
-  return ret;\r
-}\r
-\r
-gboolean\r
-xp_theme_get_system_font(LOGFONTW *lf)\r
-{\r
-  gboolean ret = FALSE;\r
-  if (get_theme_sys_font_func != NULL)\r
-    {\r
-      HRESULT hr = (*get_theme_sys_font_func)(NULL, TMT_MSGBOXFONT, lf);\r
-      ret = (hr == S_OK);\r
-    }\r
-  return ret;\r
-}\r
+/* Wimp "Windows Impersonator" Engine
+ *
+ * Copyright (C) 2003 Raymond Penners <raymond@dotsphinx.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "xp_theme.h"
+
+#include <windows.h>
+#include <uxtheme.h>
+#include <tmschema.h>
+#include <math.h>
+#include <string.h>
+#include <gdk/gdkwin32.h>
+
+#include <stdio.h>
+
+static LPCWSTR class_descriptors[] =
+{
+  L"Scrollbar",
+  L"Button",
+  L"Header",
+  L"ComboBox",
+  L"Tab",
+  L"Edit",
+  L"TreeView",
+  L"Spin",
+  L"Progress",
+};
+
+static const short element_part_map[]=
+{
+  BP_CHECKBOX,
+  BP_CHECKBOX,
+  BP_PUSHBUTTON,
+  HP_HEADERITEM,
+  CP_DROPDOWNBUTTON,
+  TABP_BODY,
+  TABP_TABITEM,
+  TABP_TABITEMLEFTEDGE,
+  TABP_PANE,
+  SBP_THUMBBTNHORZ,
+  SBP_THUMBBTNVERT,
+  SBP_ARROWBTN,
+  SBP_ARROWBTN,
+  SBP_ARROWBTN,
+  SBP_ARROWBTN,
+  SBP_GRIPPERHORZ,
+  SBP_GRIPPERVERT,
+  SBP_LOWERTRACKHORZ,
+  SBP_LOWERTRACKVERT,
+  EP_EDITTEXT,
+  BP_PUSHBUTTON,
+  SPNP_UP,
+  SPNP_DOWN,
+  BP_RADIOBUTTON,
+  TVP_GLYPH,
+  TVP_GLYPH,
+  PP_CHUNK,
+  PP_CHUNKVERT,
+  PP_BAR,
+  PP_BARVERT,
+};
+
+static HINSTANCE uxtheme_dll = NULL;
+static HTHEME open_themes[XP_THEME_CLASS__SIZEOF];
+
+typedef HRESULT (FAR PASCAL *GetThemeSysFontFunc)
+     (HTHEME hTheme, int iFontID, FAR LOGFONTW *plf);
+typedef HTHEME (FAR PASCAL *OpenThemeDataFunc)
+     (HWND hwnd, LPCWSTR pszClassList);
+typedef HRESULT (FAR PASCAL *CloseThemeDataFunc)(HTHEME theme);
+typedef HRESULT (FAR PASCAL *DrawThemeBackgroundFunc)
+     (HTHEME hTheme, HDC hdc, int iPartId, int iStateId,
+      const RECT *pRect, const RECT *pClipRect);
+typedef HRESULT (FAR PASCAL *EnableThemeDialogTextureFunc)(HWND hwnd, DWORD dwFlags);
+
+static GetThemeSysFontFunc get_theme_sys_font_func = NULL;
+static OpenThemeDataFunc open_theme_data_func = NULL;
+static CloseThemeDataFunc close_theme_data_func = NULL;
+static DrawThemeBackgroundFunc draw_theme_background_func = NULL;
+static EnableThemeDialogTextureFunc enable_theme_dialog_texture_func = NULL;
+
+void
+xp_theme_init()
+{
+  int i;
+
+  if (uxtheme_dll)
+    return;
+
+  uxtheme_dll = LoadLibrary("uxtheme.dll");
+  memset(open_themes, 0, sizeof(open_themes));
+
+  open_theme_data_func = (OpenThemeDataFunc) GetProcAddress(uxtheme_dll, "OpenThemeData");
+  close_theme_data_func = (CloseThemeDataFunc) GetProcAddress(uxtheme_dll, "CloseThemeData");
+  draw_theme_background_func = (DrawThemeBackgroundFunc) GetProcAddress(uxtheme_dll, "DrawThemeBackground");
+  enable_theme_dialog_texture_func = (EnableThemeDialogTextureFunc) GetProcAddress(uxtheme_dll, "EnableThemeDialogTexture");
+  get_theme_sys_font_func = (GetThemeSysFontFunc) GetProcAddress(uxtheme_dll, "GetThemeSysFont");
+}
+
+void
+xp_theme_exit()
+{
+  int i;
+
+  if(! uxtheme_dll)
+    return;
+
+  for (i=0; i<XP_THEME_CLASS__SIZEOF; i++)
+    {
+      if (open_themes[i])
+        {
+          close_theme_data_func(open_themes[i]);
+          open_themes[i] = NULL;
+       }
+    }
+
+  FreeLibrary(uxtheme_dll);
+  uxtheme_dll = NULL;
+
+  open_theme_data_func = NULL;
+  close_theme_data_func = NULL;
+  draw_theme_background_func = NULL;
+  enable_theme_dialog_texture_func = NULL;
+  get_theme_sys_font_func = NULL;
+}
+
+static HTHEME
+xp_theme_get_handle_by_class(XpThemeClass klazz)
+{
+  if (!open_themes[klazz] && open_theme_data_func)
+    {
+      open_themes[klazz] = open_theme_data_func(NULL, class_descriptors[klazz]);
+    }
+  return open_themes[klazz];
+}
+
+static HTHEME
+xp_theme_get_handle_by_element(XpThemeElement element)
+{
+  HTHEME ret = NULL;
+  XpThemeClass klazz = XP_THEME_CLASS__SIZEOF;
+
+  switch(element)
+    {
+    case XP_THEME_ELEMENT_PRESSED_CHECKBOX:
+    case XP_THEME_ELEMENT_CHECKBOX:
+    case XP_THEME_ELEMENT_BUTTON:
+    case XP_THEME_ELEMENT_DEFAULT_BUTTON:
+    case XP_THEME_ELEMENT_RADIO_BUTTON:
+      klazz = XP_THEME_CLASS_BUTTON;
+      break;
+
+    case XP_THEME_ELEMENT_LIST_HEADER:
+      klazz = XP_THEME_CLASS_HEADER;
+      break;
+
+    case XP_THEME_ELEMENT_COMBOBUTTON:
+      klazz = XP_THEME_CLASS_COMBOBOX;
+      break;
+
+    case XP_THEME_ELEMENT_BODY:
+    case XP_THEME_ELEMENT_TAB_ITEM:
+    case XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE:
+    case XP_THEME_ELEMENT_TAB_PANE:
+      klazz = XP_THEME_CLASS_TAB;
+      break;
+
+    case XP_THEME_ELEMENT_SCROLLBAR_V:
+    case XP_THEME_ELEMENT_SCROLLBAR_H:
+    case XP_THEME_ELEMENT_ARROW_UP:
+    case XP_THEME_ELEMENT_ARROW_DOWN:
+    case XP_THEME_ELEMENT_ARROW_LEFT:
+    case XP_THEME_ELEMENT_ARROW_RIGHT:
+    case XP_THEME_ELEMENT_GRIP_V:
+    case XP_THEME_ELEMENT_GRIP_H:
+    case XP_THEME_ELEMENT_TROUGH_V:
+    case XP_THEME_ELEMENT_TROUGH_H:
+      klazz = XP_THEME_CLASS_SCROLLBAR;
+      break;
+
+    case XP_THEME_ELEMENT_EDIT_TEXT:
+      klazz = XP_THEME_CLASS_EDIT;
+      break;
+
+    case XP_THEME_ELEMENT_SPIN_BUTTON_UP:
+    case XP_THEME_ELEMENT_SPIN_BUTTON_DOWN:
+      klazz = XP_THEME_CLASS_SPIN;
+      break;
+
+    case XP_THEME_ELEMENT_PROGRESS_BAR_H:
+    case XP_THEME_ELEMENT_PROGRESS_BAR_V:
+    case XP_THEME_ELEMENT_PROGRESS_TROUGH_H:
+    case XP_THEME_ELEMENT_PROGRESS_TROUGH_V:
+      klazz = XP_THEME_CLASS_PROGRESS;
+      break;
+
+    case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED:
+    case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED:
+      klazz = XP_THEME_CLASS_TREEVIEW;
+      break;
+    }
+
+  if (klazz != XP_THEME_CLASS__SIZEOF)
+    {
+      ret = xp_theme_get_handle_by_class (klazz);
+    }
+  return ret;
+}
+
+
+static int
+xp_theme_map_gtk_state(XpThemeElement element, GtkStateType state)
+{
+  int ret;
+
+  switch(element)
+    {
+    case XP_THEME_ELEMENT_TAB_PANE:
+      ret = 0;
+      break;
+
+    case XP_THEME_ELEMENT_TAB_ITEM_LEFT_EDGE:
+    case XP_THEME_ELEMENT_TAB_ITEM:
+      switch(state)
+        {
+        case GTK_STATE_PRELIGHT:
+          ret =  TIS_HOT;
+          break;
+        case GTK_STATE_INSENSITIVE:
+          ret =  TIS_DISABLED;
+          break;
+        case GTK_STATE_SELECTED:
+        case GTK_STATE_ACTIVE:
+          ret =  TIS_NORMAL;
+          break;
+        default:
+          ret =  TIS_SELECTED;
+        }
+      break;
+
+    case XP_THEME_ELEMENT_EDIT_TEXT:
+      switch(state)
+        {
+        case GTK_STATE_PRELIGHT:
+          ret =  ETS_FOCUSED;
+          break;
+        case GTK_STATE_INSENSITIVE:
+          ret =  ETS_READONLY;
+          break;
+        case GTK_STATE_SELECTED:
+        case GTK_STATE_ACTIVE:
+        default:
+          ret =  ETS_NORMAL;
+        }
+      break;
+
+    case XP_THEME_ELEMENT_SCROLLBAR_H:
+    case XP_THEME_ELEMENT_SCROLLBAR_V:
+    case XP_THEME_ELEMENT_TROUGH_H:
+    case XP_THEME_ELEMENT_TROUGH_V:
+      switch(state)
+        {
+        case GTK_STATE_SELECTED:
+        case GTK_STATE_ACTIVE:
+          ret =  SCRBS_PRESSED;
+          break;
+        case GTK_STATE_PRELIGHT:
+          ret =  SCRBS_HOT;
+          break;
+        case GTK_STATE_INSENSITIVE:
+          ret =  SCRBS_DISABLED;
+          break;
+        default:
+          ret =  SCRBS_NORMAL;
+        }
+      break;
+
+    case XP_THEME_ELEMENT_ARROW_DOWN:
+      switch(state)
+        {
+        case GTK_STATE_ACTIVE:
+          ret =  ABS_DOWNPRESSED;
+          break;
+        case GTK_STATE_PRELIGHT:
+          ret =  ABS_DOWNHOT;
+          break;
+        case GTK_STATE_INSENSITIVE:
+          ret =  ABS_DOWNDISABLED;
+          break;
+        default:
+          ret =  ABS_DOWNNORMAL;
+        }
+      break;
+
+    case XP_THEME_ELEMENT_ARROW_UP:
+      switch(state)
+        {
+        case GTK_STATE_ACTIVE:
+          ret =  ABS_UPPRESSED;
+          break;
+        case GTK_STATE_PRELIGHT:
+          ret =  ABS_UPHOT;
+          break;
+        case GTK_STATE_INSENSITIVE:
+          ret =  ABS_UPDISABLED;
+          break;
+        default:
+          ret =  ABS_UPNORMAL;
+        }
+      break;
+
+    case XP_THEME_ELEMENT_ARROW_LEFT:
+      switch(state)
+        {
+        case GTK_STATE_ACTIVE:
+          ret =  ABS_LEFTPRESSED;
+          break;
+        case GTK_STATE_PRELIGHT:
+          ret =  ABS_LEFTHOT;
+          break;
+        case GTK_STATE_INSENSITIVE:
+          ret =  ABS_LEFTDISABLED;
+          break;
+        default:
+          ret =  ABS_LEFTNORMAL;
+        }
+      break;
+
+    case XP_THEME_ELEMENT_ARROW_RIGHT:
+      switch(state)
+        {
+        case GTK_STATE_ACTIVE:
+          ret =  ABS_RIGHTPRESSED;
+          break;
+        case GTK_STATE_PRELIGHT:
+          ret =  ABS_RIGHTHOT;
+          break;
+        case GTK_STATE_INSENSITIVE:
+          ret =  ABS_RIGHTDISABLED;
+          break;
+        default:
+          ret =  ABS_RIGHTNORMAL;
+        }
+      break;
+
+    case XP_THEME_ELEMENT_CHECKBOX:
+    case XP_THEME_ELEMENT_RADIO_BUTTON:
+      switch(state)
+        {
+        case GTK_STATE_SELECTED:
+          ret =  CBS_CHECKEDPRESSED;
+          break;
+        case GTK_STATE_PRELIGHT:
+          ret =  CBS_UNCHECKEDHOT;
+          break;
+        case GTK_STATE_INSENSITIVE:
+          ret =  CBS_UNCHECKEDDISABLED;
+          break;
+        default:
+          ret =  CBS_UNCHECKEDNORMAL;
+        }
+      break;
+
+    case XP_THEME_ELEMENT_PRESSED_CHECKBOX:
+      switch(state)
+        {
+        case GTK_STATE_SELECTED:
+          ret =  CBS_CHECKEDPRESSED;
+          break;
+        case GTK_STATE_PRELIGHT:
+          ret =  CBS_CHECKEDHOT;
+          break;
+        case GTK_STATE_INSENSITIVE:
+          ret =  CBS_CHECKEDDISABLED;
+          break;
+        default:
+          ret =  CBS_CHECKEDNORMAL;
+        }
+      break;
+
+    XP_THEME_ELEMENT_DEFAULT_BUTTON:
+      switch(state)
+        {
+        case GTK_STATE_ACTIVE:
+          ret =  PBS_PRESSED;
+          break;
+        case GTK_STATE_PRELIGHT:
+          ret =  PBS_HOT;
+          break;
+        case GTK_STATE_INSENSITIVE:
+          ret =  PBS_DISABLED;
+          break;
+        default:
+          ret =  PBS_DEFAULTED;
+        }
+      break;
+
+    case XP_THEME_ELEMENT_SPIN_BUTTON_DOWN:
+      switch(state)
+        {
+        case GTK_STATE_ACTIVE:
+          ret =  DNS_PRESSED;
+          break;
+        case GTK_STATE_PRELIGHT:
+          ret =  DNS_HOT;
+          break;
+        case GTK_STATE_INSENSITIVE:
+          ret =  DNS_DISABLED;
+          break;
+        default:
+          ret =  DNS_NORMAL;
+        }
+      break;
+
+    case XP_THEME_ELEMENT_SPIN_BUTTON_UP:
+      switch(state)
+        {
+        case GTK_STATE_ACTIVE:
+          ret =  UPS_PRESSED;
+          break;
+        case GTK_STATE_PRELIGHT:
+          ret =  UPS_HOT;
+          break;
+        case GTK_STATE_INSENSITIVE:
+          ret =  UPS_DISABLED;
+          break;
+        default:
+          ret =  UPS_NORMAL;
+        }
+      break;
+
+    case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_OPENED:
+      ret = GLPS_OPENED;
+      break;
+
+    case XP_THEME_ELEMENT_TREEVIEW_EXPANDER_CLOSED:
+      ret = GLPS_CLOSED;
+      break;
+
+    case XP_THEME_ELEMENT_PROGRESS_BAR_H:
+    case XP_THEME_ELEMENT_PROGRESS_BAR_V:
+    case XP_THEME_ELEMENT_PROGRESS_TROUGH_H:
+    case XP_THEME_ELEMENT_PROGRESS_TROUGH_V:
+      ret = 1;
+      break;
+
+    default:
+      switch(state)
+        {
+        case GTK_STATE_ACTIVE:
+          ret =  PBS_PRESSED;
+          break;
+        case GTK_STATE_PRELIGHT:
+          ret =  PBS_HOT;
+          break;
+        case GTK_STATE_INSENSITIVE:
+          ret =  PBS_DISABLED;
+          break;
+        default:
+          ret =  PBS_NORMAL;
+        }
+    }
+  return ret;
+}
+
+gboolean
+xp_theme_draw(GdkWindow *win, XpThemeElement element, GtkStyle *style,
+              int x, int y, int width, int height, GtkStateType state_type)
+{
+  HTHEME theme;
+  RECT rect;
+  int xoff, yoff, state;
+  HDC dc;
+  GdkDrawable *drawable;
+  int part_state;
+
+  if (!uxtheme_dll)
+    return FALSE;
+
+  theme = xp_theme_get_handle_by_element(element);
+  if (!theme)
+    return FALSE;
+
+  /* FIXME: Recheck its function */
+  enable_theme_dialog_texture_func(GDK_WINDOW_HWND(win), ETDT_ENABLETAB);
+
+  if (!GDK_IS_WINDOW(win))
+    {
+      xoff = 0;
+      yoff = 0;
+      drawable = win;
+    }
+  else
+    {
+      gdk_window_get_internal_paint_info(win, &drawable, &xoff, &yoff);
+    }
+  rect.left = x - xoff;
+  rect.top = y - yoff;
+  rect.right = rect.left + width;
+  rect.bottom = rect.top + height;
+
+  gdk_gc_set_clip_rectangle (style->dark_gc[state_type], NULL);
+  dc = gdk_win32_hdc_get(drawable, style->dark_gc[state_type], 0);
+  if (!dc)
+    return FALSE;
+
+  part_state = xp_theme_map_gtk_state(element, state_type);
+  draw_theme_background_func(theme, dc, element_part_map[element], part_state, &rect, 0);
+  gdk_win32_hdc_release(drawable, style->dark_gc[state_type], 0);
+
+  return TRUE;
+}
+
+gboolean
+xp_theme_is_drawable(XpThemeElement element)
+{
+  gboolean ret = FALSE;
+
+  if (uxtheme_dll)
+    {
+      ret = xp_theme_get_handle_by_element(element) != NULL;
+    }
+  return ret;
+}
+
+gboolean
+xp_theme_get_system_font(LOGFONTW *lf)
+{
+  gboolean ret = FALSE;
+  if (get_theme_sys_font_func != NULL)
+    {
+      HRESULT hr = (*get_theme_sys_font_func)(NULL, TMT_MSGBOXFONT, lf);
+      ret = (hr == S_OK);
+    }
+  return ret;
+}